package com.partsoft.dits.message;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

import com.partsoft.dits.anns.Concatenation;
import com.partsoft.dits.anns.Message;
import com.partsoft.dits.anns.MessageProperty;

/**
 * 默认的消息处理器
 */
public interface MessageProcessor {

	/**
	 * 消息处理器缺省实例
	 */
	static MessageProcessor INSTANCE = new MessageProcessorImpl();

	/**
	 * 把消息实体打包成消息字节码
	 * 
	 * @param msgEntity
	 *            消息实体
	 * @param format
	 *            消息格式 {@link MessageFormat} ，可以为null，为null时输出格式由其实现类决定）
	 * @return 消息字符串 （JAVA内部编码，如果需要用作输出，请自行编码为utf-8字节，如
	 *         {@link String#getBytes(java.nio.charset.Charset)}）
	 */
	String toMessageBytes(MessageEntity msgEntity, MessageFormat format);

	/**
	 * 把消息实体打包成消息字节码(输出格式由其实现类决定)
	 * 
	 * @param msgEntity
	 *            消息实体对象
	 * @return 消息字符串 （JAVA内部编码，如果需要用作输出，请自行编码为utf-8字节，如
	 *         {@link String#getBytes(java.nio.charset.Charset)}）
	 */
	String toMessageBytes(MessageEntity msgEntity);

	// 智能消息格式判断
	/**
	 * 自动从消息字节中判断格式，然后获取消息实体
	 */
	MessageEntity fromMessageBytes(InputStream messageInputStream) throws MessageException;

	/**
	 * 自动从消息字节中判断格式，然后获取消息实体
	 */
	MessageEntity fromMessageBytes(String messageString) throws MessageException;

	/**
	 * 自动从消息字节中判断格式，然后获取消息实体
	 */
	MessageEntity fromMessageBytes(byte[] messageBytes) throws MessageException;

	/**
	 * 打包多条记录消息
	 * 
	 * @param owner
	 *            上级消息所有者 可以为null
	 * @param messageCode
	 *            消息编码
	 * @param defeaultAction
	 *            缺省动作
	 * @param from
	 *            来源系统编码
	 * @param rows
	 *            记录条目
	 * @param resolver
	 *            级联消息获取器，可以为null
	 * @return 消息实体
	 */
	MessageEntity newMessage(MessageEntity owner, String messageCode, DataAction defeaultAction,
			List<Map<DataProperty, String>> rows, MessageConcatenationResolver resolver);

	MessageEntity newMessage(MessageEntity owner, String messageIdOrVersion, String messageCode,
			DataAction defeaultAction, String from, List<Map<DataProperty, String>> rows,
			MessageConcatenationResolver resolver);

	/**
	 * 从POJO或数据和集合中构造消息实体<br/>
	 * 可以使用下注解类对POJO进行注解：<br/>
	 * <ul>
	 * <li>{@link Message}</li>
	 * <li>{@link MessageProperty}</li>
	 * <li>{@link Concatenation}</li>
	 * </ul>
	 * 
	 * @param object
	 * @return 消息实体
	 */
	MessageEntity newMessage(Object object, DataAction defaultAction) throws MessageException;

	MessageEntity newMessage(Object object, String messageIdOrVersion, DataAction defaultAction)
			throws MessageException;

	MessageEntity newMessage(Object object, DataAction defaultAction, MessageEntityBuildCallback buildCallback)
			throws MessageException;

	MessageEntity newMessage(Object object, String messageIdOrVersion, DataAction defaultAction,
			MessageEntityBuildCallback buildCallback) throws MessageException;

}
